package br.com.edumobi;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.com.edumobi.dados.modelos.Alternativa;
import br.com.edumobi.dados.modelos.Aluno;
import br.com.edumobi.dados.modelos.Cidade;
import br.com.edumobi.dados.modelos.Classificacao;
import br.com.edumobi.dados.modelos.Endereco;
import br.com.edumobi.dados.modelos.Questao;
import br.com.edumobi.dados.modelos.Simulado;
import br.com.edumobi.dados.modelos.enuns.Nivel;
import br.com.edumobi.dados.modelos.enuns.Sexo;
import br.com.edumobi.dados.modelos.enuns.UF;
import br.com.edumobi.utils.Dates;

public abstract class T {

    public static final long MOCK_USUARIO_VALIDO_ID = 1L;

    public static final String MOCK_USUARIO_VALIDO_NOME = "Usuário";
    public static final String MOCK_USUARIO_VALIDO_CPF = "011.654.876-09";
    public static final String MOCK_USUARIO_VALIDO_EMAIL = "usuario@mail.com";
    public static final String MOCK_USUARIO_VALIDO_SENHA = "123456";
    public static final String MOCK_USUARIO_VALIDO_MATRICULA = "0000000001";
    public static final String MOCK_USUARIO_VALIDO_TELEFONE_RESIDENCIAL = "(81)3344-5566";
    public static final String MOCK_USUARIO_VALIDO_TELEFONE_CELULAR = "(81)8877-6655";
    public static final Sexo MOCK_USUARIO_VALIDO_SEXO = Sexo.MASCULINO;

    public static final Cidade MOCK_USUARIO_VALIDO_CIDADE = new Cidade(1L, "Recife", UF.PE);
    public static final Endereco MOCK_USUARIO_VALIDO_ENDERECO = new Endereco("Rua Qualquer", "321", "Comp. Qualquer", "Centro", "50780-220", MOCK_USUARIO_VALIDO_CIDADE);

    public static final Date MOCK_USUARIO_VALIDO_DATA_DE_NASCIMENTO = new Date();

    public static Aluno getMockAlunoValido() {
        return new Aluno(
                MOCK_USUARIO_VALIDO_ID,
                MOCK_USUARIO_VALIDO_NOME,
                MOCK_USUARIO_VALIDO_CPF,
                MOCK_USUARIO_VALIDO_EMAIL,
                MOCK_USUARIO_VALIDO_SENHA,
                MOCK_USUARIO_VALIDO_SEXO,
                MOCK_USUARIO_VALIDO_MATRICULA,
                MOCK_USUARIO_VALIDO_DATA_DE_NASCIMENTO,
                MOCK_USUARIO_VALIDO_ENDERECO,
                MOCK_USUARIO_VALIDO_TELEFONE_RESIDENCIAL,
                MOCK_USUARIO_VALIDO_TELEFONE_CELULAR
        );
    }

    public static List<Classificacao> getMockListaDeClassificacoes() {
        List<Classificacao> classificacoes = new ArrayList<Classificacao>();

        classificacoes.add(new Classificacao(1L, "Programação", "Conjunto de questões sobre certificações de linguagens de programação.", null, null));
        classificacoes.add(new Classificacao(2L, "Banco de Dados", "Conjunto de questões sobre certificações de bancos de dados.", null, null));
        classificacoes.add(new Classificacao(3L, "Gerenciamento de Projetos", "Conjunto de questões sobre certificações de gerenciamento de projetos.", null, null));
        classificacoes.add(new Classificacao(4L, "Metodologias", "Conjunto de questões sobre certificações de metodologias.", null, null));
        classificacoes.add(new Classificacao(5L, "Teste", "Conjunto de questões sobre certificações de testes de softwares.", null, null));
        classificacoes.add(new Classificacao(6L, "Gerenciamento de TI", "Conjunto de questões sobre certificações de gerenciamento de TI.", null, null));
        classificacoes.add(new Classificacao(7L, "Infraestrutura de TI", "Conjunto de questões sobre certificações de infraestrura de TI.", null, null));

        classificacoes.add(new Classificacao(8L, "Java", "Conjunto de questões sobre certificações Java.", classificacoes.get(0), null));
        classificacoes.add(new Classificacao(9L, "C#", "Conjunto de questões sobre certificações C# .NET.", classificacoes.get(0), null));
        classificacoes.add(new Classificacao(10L, "PHP", "Conjunto de questões sobre certificações PHP.", classificacoes.get(0), null));
        classificacoes.add(new Classificacao(11L, "HTML5", "Conjunto de questões sobre certificações HTML5", classificacoes.get(0), null));

        classificacoes.add(new Classificacao(12L, "Java SE", "Conjunto de questões sobre certificações Java SE.", classificacoes.get(7), null));
        classificacoes.add(new Classificacao(13L, "Java EE", "Conjunto de questões sobre certificações Java EE.", classificacoes.get(7), null));
        classificacoes.add(new Classificacao(14L, "Java ME", "Conjunto de questões sobre certificações Java ME.", classificacoes.get(7), null));

        classificacoes.get(11).questoes = new ArrayList<Questao>();

        Questao questao;
        Alternativa alternativaUm, alternativaDois, alternativaTres, alternativaQuatro;

        alternativaUm = new Alternativa(1L, "toString()");
        alternativaDois = new Alternativa(2L, "main()");
        alternativaTres = new Alternativa(3L, "equals()");
        alternativaQuatro = new Alternativa(4L, "hashcode()");

        questao = new Questao(1L, "Qual método é necessário para executar um aplicação Java?", "O metodo main() é obrigatório para executar um programa Java.", null, alternativaDois, new ArrayList<Alternativa>(), Nivel.MEDIO);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        alternativaUm = new Alternativa(5L, "Tipos primitivos não podem ser nulos");
        alternativaDois = new Alternativa(6L, "int");
        alternativaTres = new Alternativa(7L, "char");
        alternativaQuatro = new Alternativa(8L, "long");

        questao = new Questao(2L, "Quais tipos primitivos podem ser nulos?", "Nenhum tipo primitivo pode ser nulo.", null, alternativaUm, new ArrayList<Alternativa>(), Nivel.FACIL);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        alternativaUm = new Alternativa(9L, "Sim");
        alternativaDois = new Alternativa(10L, "Não");
        alternativaTres = new Alternativa(11L, "Pode ser");
        alternativaQuatro = new Alternativa(12L, "Mais ou menos");

        questao = new Questao(3L, "Posso testar de qualquer forma essa questão?", "Claro que sim.", null, alternativaUm, new ArrayList<Alternativa>(), Nivel.MUITO_FACIL);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        alternativaUm = new Alternativa(13L, "Sim");
        alternativaDois = new Alternativa(14L, "Não");
        alternativaTres = new Alternativa(15L, "Pode ser");
        alternativaQuatro = new Alternativa(16L, "Depois");

        questao = new Questao(4L, "Posso morrer de testar essa aplicação e ela não vai quebrar?", "Claro que sim.", null, alternativaUm, new ArrayList<Alternativa>(), Nivel.MUITO_DIFICIL);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        alternativaUm = new Alternativa(17L, "1");
        alternativaDois = new Alternativa(18L, "2");
        alternativaTres = new Alternativa(19L, "12");
        alternativaQuatro = new Alternativa(20L, "3");

        questao = new Questao(5L, "1 + 2 é igual à...?", "Bicho burro.", null, alternativaQuatro, new ArrayList<Alternativa>(), Nivel.MUITO_DIFICIL);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        alternativaUm = new Alternativa(21L, "S. Jobs");
        alternativaDois = new Alternativa(22L, "N. Glauber");
        alternativaTres = new Alternativa(23L, "Tio Bill");
        alternativaQuatro = new Alternativa(24L, "João do Morro");

        questao = new Questao(6L, "Quem é o melhor do melhor do melhor do mundo em Android?", "Bota quente.", null, alternativaDois, new ArrayList<Alternativa>(), Nivel.MUITO_FACIL);

        questao.alternativas.add(alternativaUm);
        questao.alternativas.add(alternativaDois);
        questao.alternativas.add(alternativaTres);
        questao.alternativas.add(alternativaQuatro);

        classificacoes.get(11).questoes.add(questao);

        return classificacoes;
    }

    public static List<Simulado> getMockListaDeSimulados() {
        List<Simulado> simulados = new ArrayList<Simulado>();

        simulados.add(new Simulado(
                1L,
                "OCA Java 7",
                "Certificação Associado Oracle - Java 7",
                new Classificacao(12L, "Java SE", "Conjunto de questões sobre certificações Java SE.", null, null),
                5,
                Dates.stringToDate("00:10", Dates.FORMAT_HH_MM)));

        return simulados;
    }
}
